package br.com.virtual.correio.service.impl;

import java.math.BigDecimal;
import java.util.List;
import java.util.Set;

import javax.ejb.Local;
import javax.ejb.Stateless;

import org.tempuri.CResultado;
import org.tempuri.CServico;
import org.tempuri.CalcPrecoPrazoWS;
import org.tempuri.CalcPrecoPrazoWSSoap;

import br.com.virtual.base.uteis.VirtualConstants;
import br.com.virtual.cadastrar.model.Produto;
import br.com.virtual.correio.enums.TipoFrete;
import br.com.virtual.correio.service.CalculadorDeFreteService;
import br.com.virtual.vender.model.Frete;
import br.com.virtual.vender.model.ItemVenda;

@Stateless @Local(CalculadorDeFreteService.class)
public class CalculadorDeFreteServiceImpl implements CalculadorDeFreteService, VirtualConstants {


	private CalcPrecoPrazoWSSoap proxy;
	
	public CalculadorDeFreteServiceImpl() {
		proxy = new CalcPrecoPrazoWS().getCalcPrecoPrazoWSSoap();
	}
	
	@Override
	public Frete calculaPrecoPrazo(Produto produto, TipoFrete tipoFrete, String cepOrigem, String cepDestino){
		
		CServico servico = consultaWS(produto, tipoFrete, cepOrigem, cepDestino);
		return new Frete( servico.getValor(), servico.getPrazoEntrega(), tipoFrete);
	}

	@Override
	public Frete calculaPrecoPrazo(Set<Produto> produtos, TipoFrete tipoFrete, String cepOrigem, String cepDestino) {
		
		Frete frete = null;
		for(Produto p : produtos){
			Frete freteAux = calculaPrecoPrazo(p, tipoFrete, cepOrigem, cepDestino);
			if(frete == null){
				frete = freteAux;
			}else{
				frete.addFrete(freteAux.getValor());
				if(frete.getPrazoEntrega() < freteAux.getPrazoEntrega())
					frete.setPrazoEntrega( freteAux.getPrazoEntrega() );
			}
		}
		
		return frete;
	}

	@Override
	public Frete calculaPrecoPrazo(List<ItemVenda> itensVenda,
			TipoFrete tipoFrete, String cepOrigem, String cepDestino) {

		Frete frete = new Frete(tipoFrete);
		
		for(ItemVenda i : itensVenda){
			Frete freteAux = calculaPrecoPrazo(i.getProduto(), tipoFrete, cepOrigem, cepDestino);
				frete.addFrete(freteAux.getValor(), i.getQuantidade());

				if(frete.getPrazoEntrega() < freteAux.getPrazoEntrega())
					frete.setPrazoEntrega( freteAux.getPrazoEntrega() );
		}
		
		return frete;
	}
	
	
	private CServico consultaWS(Produto produto, TipoFrete tipoFrete, String cepOrigem, String cepDestino){
		
		String strTipoFrete = (tipoFrete.equals(TipoFrete.SEDEX)) ? "40010" : "41106";
		String peso = String.valueOf( Math.round(produto.getPeso()));
		
		CResultado resultado = proxy.calcPrecoPrazo(	"", 
				"", 
				strTipoFrete, //"41106", 
				trataCep(cepOrigem), //"13100210", 
				trataCep(cepDestino), //"20010140", 
				peso, //"30", 
				1, 
				new BigDecimal(produto.getComprimentoEmbalagem()), // new BigDecimal(100), // comprimento  
				new BigDecimal(produto.getAlturaEmbalagem()),// new BigDecimal(50), // altura
				new BigDecimal(produto.getLarguraEmbalagem()),// new BigDecimal(50), // largura
				new BigDecimal(0), // diametro
				"N", 
				new BigDecimal(0), 
				"N");

		List<CServico> servicos = resultado.getServicos().getCServico();
		CServico servico = servicos.get(0);
		
		printServico(servico);
		
		return servico;
	}
	
	private String trataCep(String cep){
		
		return cep.replace("-", "");
	}
	
	private void printServico(CServico servico){
		
		System.out.println("ERRO: " + servico.getErro());
		System.out.println("MSG: " + servico.getMsgErro());
		System.out.println("VALOR: " + servico.getValor());
		System.out.println("PRAZO: " + servico.getPrazoEntrega());
		
	}

}
